package org.convallaria.system.biz.service.sys;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import org.convallaria.system.biz.entity.SysPost;

import java.util.List;
import java.util.Set;

/**
 * 系统岗位服务接口
 * 
 * 功能特性：
 * - 岗位基础CRUD操作
 * - 岗位用户关联管理
 * - 岗位权限管理
 * - 岗位缓存管理
 * 
 * @author convallaria
 * @since 1.0.0
 */
public interface SysPostService extends IService<SysPost> {

    /**
     * 分页查询岗位列表
     * 
     * @param pageNum 页码
     * @param pageSize 页大小
     * @param postName 岗位名称（可选）
     * @param postCode 岗位编码（可选）
     * @param status 状态（可选）
     * @param tenantId 租户ID（可选）
     * @return 岗位分页列表
     */
    IPage<SysPost> pagePosts(Integer pageNum, Integer pageSize, String postName, String postCode, String status, Long tenantId);

    /**
     * 根据岗位ID获取岗位信息（带缓存）
     * 
     * @param postId 岗位ID
     * @return 岗位信息
     */
    SysPost getPostById(Long postId);

    /**
     * 根据岗位编码获取岗位信息
     * 
     * @param postCode 岗位编码
     * @param tenantId 租户ID
     * @return 岗位信息
     */
    SysPost getPostByCode(String postCode, Long tenantId);

    /**
     * 获取所有岗位列表
     * 
     * @param tenantId 租户ID
     * @return 岗位列表
     */
    List<SysPost> getAllPosts(Long tenantId);

    /**
     * 获取用户的岗位列表
     * 
     * @param userId 用户ID
     * @param tenantId 租户ID
     * @return 岗位列表
     */
    List<SysPost> getUserPosts(Long userId, Long tenantId);

    /**
     * 更新岗位信息（清除相关缓存）
     * 
     * @param post 岗位信息
     * @return 是否成功
     */
    boolean updatePost(SysPost post);

    /**
     * 删除岗位（清除相关缓存）
     * 
     * @param postId 岗位ID
     * @return 是否成功
     */
    boolean deletePost(Long postId);

    /**
     * 批量删除岗位（清除相关缓存）
     * 
     * @param postIds 岗位ID列表
     * @return 是否成功
     */
    boolean deletePosts(List<Long> postIds);

    /**
     * 刷新岗位缓存
     * 
     * @param post 岗位信息
     * @return 岗位信息
     */
    SysPost refreshPostCache(SysPost post);

    /**
     * 获取用户的所有岗位权限
     * 
     * @param userId 用户ID
     * @param tenantId 租户ID
     * @return 岗位ID集合
     */
    Set<Long> getUserPostPermissions(Long userId, Long tenantId);

    /**
     * 分配用户岗位
     * 
     * @param userId 用户ID
     * @param postIds 岗位ID列表
     * @return 是否成功
     */
    boolean assignUserPosts(Long userId, List<Long> postIds);

    /**
     * 取消用户岗位
     * 
     * @param userId 用户ID
     * @param postIds 岗位ID列表
     * @return 是否成功
     */
    boolean unassignUserPosts(Long userId, List<Long> postIds);

    /**
     * 检查岗位名称是否唯一
     * 
     * @param postName 岗位名称
     * @param postId 岗位ID（更新时排除自己）
     * @param tenantId 租户ID
     * @return 是否唯一
     */
    boolean isPostNameUnique(String postName, Long postId, Long tenantId);

    /**
     * 检查岗位编码是否唯一
     * 
     * @param postCode 岗位编码
     * @param postId 岗位ID（更新时排除自己）
     * @param tenantId 租户ID
     * @return 是否唯一
     */
    boolean isPostCodeUnique(String postCode, Long postId, Long tenantId);

    /**
     * 检查岗位是否被用户使用
     * 
     * @param postId 岗位ID
     * @return 是否被使用
     */
    boolean isPostInUse(Long postId);

    /**
     * 根据岗位名称搜索岗位
     * 
     * @param postName 岗位名称
     * @param tenantId 租户ID
     * @return 岗位列表
     */
    List<SysPost> searchPostsByName(String postName, Long tenantId);

    /**
     * 根据岗位编码搜索岗位
     * 
     * @param postCode 岗位编码
     * @param tenantId 租户ID
     * @return 岗位列表
     */
    List<SysPost> searchPostsByCode(String postCode, Long tenantId);

    /**
     * 获取岗位的用户数量
     * 
     * @param postId 岗位ID
     * @return 用户数量
     */
    int getPostUserCount(Long postId);

    /**
     * 获取岗位的完整信息（包含用户数量等）
     * 
     * @param postId 岗位ID
     * @return 岗位完整信息
     */
    SysPost getPostWithUserCount(Long postId);

    /**
     * 批量获取岗位信息
     * 
     * @param postIds 岗位ID列表
     * @return 岗位列表
     */
    List<SysPost> getPostsByIds(List<Long> postIds);

    /**
     * 检查岗位状态是否有效
     * 
     * @param postId 岗位ID
     * @return 是否有效
     */
    boolean isPostStatusValid(Long postId);
}
